{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# https://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/\n",
    "import numpy\n",
    "import pandas\n",
    "import math\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Dense\n",
    "from keras.wrappers.scikit_learn import KerasClassifier\n",
    "from keras.utils import np_utils\n",
    "from sklearn.model_selection import cross_val_score\n",
    "from sklearn.model_selection import cross_val_predict\n",
    "from sklearn.model_selection import KFold\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import matthews_corrcoef"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Initialize Random Number Generator\n",
    "# fix random seed for reproducibility\n",
    "seed = 7\n",
    "numpy.random.seed(seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# load dataset\n",
    "\n",
    "dataframe = pandas.read_csv(\"normalAndNeptune.csv\")#, header=True) \n",
    "\n",
    "# samples 10000 random data points from 500k\n",
    "dataframe = dataframe.sample(n=50000)\n",
    "# LabelEncoder, turns all our categorical data into integers\n",
    "le = LabelEncoder()\n",
    "\n",
    "# apply \"le.fit_transform\" to every column (usually only works on 1 column)\n",
    "dataframe_encoded = dataframe.apply(le.fit_transform)\n",
    "attack_labels = le.classes_\n",
    "dataset = dataframe_encoded.values\n",
    "\n",
    "#Set X as our input data and Y as our label\n",
    "X = dataset[:,0:41].astype(float)\n",
    "Y = dataset[:,41]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n"
     ]
    }
   ],
   "source": [
    "# encode class values as integers\n",
    "encoder = LabelEncoder()\n",
    "encoder.fit(Y)\n",
    "encoded_Y = encoder.transform(Y)\n",
    "# convert integers to dummy variables (i.e. one hot encoded)\n",
    "dummy_y = np_utils.to_categorical(encoded_Y)\n",
    "# print(dummy_y)\n",
    "#print(len(dummy_y[0]))\n",
    "num_of_classes = len(dummy_y[0])  # the length of dummy y is the number of classes we have in our small sample\n",
    "# since we are randomly sampling from a large dataset, we might not get 1 of every class in our sample\n",
    "# we need to set output layer to be equal to the length of our dummy_y vectors\n",
    "print(num_of_classes)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# define baseline model\n",
    "def baseline_model():\n",
    "    # create model\n",
    "    model = Sequential()\n",
    "    \n",
    "    inputs = 41\n",
    "    hidden_layer1 = 10\n",
    "    hidden_layer2 = 5\n",
    "    hidden_layer3 = 0\n",
    "    outputs = num_of_classes  #needs to be this variable in case we forget to sample. Could end up having 10 classes or 12, etc\n",
    "    \n",
    "    model.add(Dense(hidden_layer1, input_dim=inputs, activation='relu'))\n",
    "    if hidden_layer2 != 0:\n",
    "        model.add(Dense(hidden_layer2, activation='relu'))\n",
    "    if hidden_layer3 != 0:\n",
    "        model.add(Dense(hidden_layer3, activation='relu'))\n",
    "    model.add(Dense(outputs, activation='softmax'))\n",
    "    \n",
    "    # Compile model\n",
    "    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) #optimizer=adam\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/32\n",
      " - 1s - loss: 2.4195 - acc: 0.8282\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0339 - acc: 0.9914\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0184 - acc: 0.9990\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0143 - acc: 0.9996\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0111 - acc: 0.9997\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0090 - acc: 0.9998\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0077 - acc: 0.9998\n",
      "Epoch 8/32\n",
      " - 0s - loss: 0.0066 - acc: 0.9999\n",
      "Epoch 9/32\n",
      " - 0s - loss: 0.0057 - acc: 0.9998\n",
      "Epoch 10/32\n",
      " - 0s - loss: 0.0049 - acc: 0.9999\n",
      "Epoch 11/32\n",
      " - 0s - loss: 0.0044 - acc: 0.9999\n",
      "Epoch 12/32\n",
      " - 0s - loss: 0.0039 - acc: 0.9999\n",
      "Epoch 13/32\n",
      " - 0s - loss: 0.0034 - acc: 0.9999\n",
      "Epoch 14/32\n",
      " - 0s - loss: 0.0031 - acc: 0.9999\n",
      "Epoch 15/32\n",
      " - 0s - loss: 0.0028 - acc: 0.9999\n",
      "Epoch 16/32\n",
      " - 0s - loss: 0.0025 - acc: 0.9999\n",
      "Epoch 17/32\n",
      " - 0s - loss: 0.0020 - acc: 0.9999\n",
      "Epoch 18/32\n",
      " - 0s - loss: 0.0019 - acc: 0.9999\n",
      "Epoch 19/32\n",
      " - 0s - loss: 0.0017 - acc: 1.0000\n",
      "Epoch 20/32\n",
      " - 0s - loss: 0.0016 - acc: 1.0000\n",
      "Epoch 21/32\n",
      " - 0s - loss: 0.0015 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 0.0014 - acc: 1.0000\n",
      "Epoch 23/32\n",
      " - 0s - loss: 0.0014 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 0.0012 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 8.7796e-04 - acc: 0.9999\n",
      "Epoch 26/32\n",
      " - 0s - loss: 7.6916e-04 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 7.5951e-04 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 7.5352e-04 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 7.5003e-04 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 7.4824e-04 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 7.4617e-04 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 7.4394e-04 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 1s - loss: 0.2288 - acc: 0.9728\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0043 - acc: 0.9988\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0023 - acc: 0.9996\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0018 - acc: 0.9997\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0015 - acc: 0.9998\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0014 - acc: 0.9998\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0013 - acc: 0.9998\n",
      "Epoch 8/32\n",
      " - 0s - loss: 0.0012 - acc: 0.9998\n",
      "Epoch 9/32\n",
      " - 0s - loss: 0.0011 - acc: 0.9998\n",
      "Epoch 10/32\n",
      " - 0s - loss: 0.0011 - acc: 0.9998\n",
      "Epoch 11/32\n",
      " - 0s - loss: 0.0010 - acc: 0.9999\n",
      "Epoch 12/32\n",
      " - 0s - loss: 9.2186e-04 - acc: 0.9998\n",
      "Epoch 13/32\n",
      " - 0s - loss: 8.9724e-04 - acc: 0.9999\n",
      "Epoch 14/32\n",
      " - 0s - loss: 7.9439e-04 - acc: 0.9999\n",
      "Epoch 15/32\n",
      " - 0s - loss: 7.3952e-04 - acc: 0.9999\n",
      "Epoch 16/32\n",
      " - 0s - loss: 6.3246e-04 - acc: 0.9999\n",
      "Epoch 17/32\n",
      " - 0s - loss: 6.3999e-04 - acc: 0.9999\n",
      "Epoch 18/32\n",
      " - 0s - loss: 5.7637e-04 - acc: 0.9999\n",
      "Epoch 19/32\n",
      " - 0s - loss: 5.4724e-04 - acc: 0.9999\n",
      "Epoch 20/32\n",
      " - 0s - loss: 4.0318e-04 - acc: 0.9999\n",
      "Epoch 21/32\n",
      " - 0s - loss: 4.3267e-04 - acc: 0.9999\n",
      "Epoch 22/32\n",
      " - 0s - loss: 3.8515e-04 - acc: 0.9999\n",
      "Epoch 23/32\n",
      " - 0s - loss: 3.0066e-04 - acc: 0.9999\n",
      "Epoch 24/32\n",
      " - 0s - loss: 2.9530e-04 - acc: 0.9999\n",
      "Epoch 25/32\n",
      " - 0s - loss: 2.0762e-04 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 1.6102e-04 - acc: 0.9999\n",
      "Epoch 27/32\n",
      " - 0s - loss: 1.5165e-04 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 1.6034e-04 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 8.3354e-05 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 8.6973e-05 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 9.5611e-05 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 8.9779e-05 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 1s - loss: 1.8181 - acc: 0.5754\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.2608 - acc: 0.9910\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.1798 - acc: 0.9952\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.1204 - acc: 0.9973\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0420 - acc: 0.9989\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0022 - acc: 0.9994\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0017 - acc: 0.9996\n",
      "Epoch 8/32\n",
      " - 0s - loss: 0.0014 - acc: 0.9996\n",
      "Epoch 9/32\n",
      " - 0s - loss: 0.0011 - acc: 0.9998\n",
      "Epoch 10/32\n",
      " - 0s - loss: 9.3719e-04 - acc: 0.9999\n",
      "Epoch 11/32\n",
      " - 0s - loss: 8.2494e-04 - acc: 0.9999\n",
      "Epoch 12/32\n",
      " - 0s - loss: 7.1161e-04 - acc: 0.9999\n",
      "Epoch 13/32\n",
      " - 0s - loss: 6.5497e-04 - acc: 0.9999\n",
      "Epoch 14/32\n",
      " - 0s - loss: 5.9926e-04 - acc: 0.9999\n",
      "Epoch 15/32\n",
      " - 0s - loss: 5.6031e-04 - acc: 1.0000\n",
      "Epoch 16/32\n",
      " - 0s - loss: 5.2494e-04 - acc: 1.0000\n",
      "Epoch 17/32\n",
      " - 0s - loss: 5.0004e-04 - acc: 1.0000\n",
      "Epoch 18/32\n",
      " - 0s - loss: 4.8321e-04 - acc: 1.0000\n",
      "Epoch 19/32\n",
      " - 0s - loss: 4.6960e-04 - acc: 1.0000\n",
      "Epoch 20/32\n",
      " - 0s - loss: 4.5947e-04 - acc: 1.0000\n",
      "Epoch 21/32\n",
      " - 0s - loss: 4.5283e-04 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 4.4732e-04 - acc: 1.0000\n",
      "Epoch 23/32\n",
      " - 0s - loss: 4.4032e-04 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 4.4976e-04 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 4.2932e-04 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 4.1520e-04 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 4.0236e-04 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 3.8748e-04 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 3.8212e-04 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 3.7963e-04 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 3.7849e-04 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 3.7756e-04 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 1s - loss: 9.2364 - acc: 0.4247\n",
      "Epoch 2/32\n",
      " - 0s - loss: 8.4317 - acc: 0.4767\n",
      "Epoch 3/32\n",
      " - 0s - loss: 8.4313 - acc: 0.4768\n",
      "Epoch 4/32\n",
      " - 0s - loss: 8.4310 - acc: 0.4768\n",
      "Epoch 5/32\n",
      " - 0s - loss: 8.4308 - acc: 0.4769\n",
      "Epoch 6/32\n",
      " - 0s - loss: 8.4308 - acc: 0.4769\n",
      "Epoch 7/32\n",
      " - 0s - loss: 8.4307 - acc: 0.4769\n",
      "Epoch 8/32\n",
      " - 0s - loss: 8.4307 - acc: 0.4769\n",
      "Epoch 9/32\n",
      " - 0s - loss: 8.4306 - acc: 0.4769\n",
      "Epoch 10/32\n",
      " - 0s - loss: 8.4306 - acc: 0.4769\n",
      "Epoch 11/32\n",
      " - 0s - loss: 8.4306 - acc: 0.4769\n",
      "Epoch 12/32\n",
      " - 0s - loss: 8.4306 - acc: 0.4769\n",
      "Epoch 13/32\n",
      " - 0s - loss: 8.4304 - acc: 0.4769\n",
      "Epoch 14/32\n",
      " - 0s - loss: 8.4302 - acc: 0.4770\n",
      "Epoch 15/32\n",
      " - 0s - loss: 8.4301 - acc: 0.4770\n",
      "Epoch 16/32\n",
      " - 0s - loss: 8.4299 - acc: 0.4770\n",
      "Epoch 17/32\n",
      " - 0s - loss: 8.4297 - acc: 0.4770\n",
      "Epoch 18/32\n",
      " - 0s - loss: 8.4296 - acc: 0.4770\n",
      "Epoch 19/32\n",
      " - 0s - loss: 3.2158 - acc: 0.7958\n",
      "Epoch 20/32\n",
      " - 0s - loss: 0.0021 - acc: 0.9995\n",
      "Epoch 21/32\n",
      " - 0s - loss: 0.0013 - acc: 0.9998\n",
      "Epoch 22/32\n",
      " - 0s - loss: 9.4327e-04 - acc: 0.9999\n",
      "Epoch 23/32\n",
      " - 0s - loss: 7.9736e-04 - acc: 0.9999\n",
      "Epoch 24/32\n",
      " - 0s - loss: 6.6830e-04 - acc: 0.9999\n",
      "Epoch 25/32\n",
      " - 0s - loss: 6.0425e-04 - acc: 0.9999\n",
      "Epoch 26/32\n",
      " - 0s - loss: 5.1748e-04 - acc: 0.9999\n",
      "Epoch 27/32\n",
      " - 0s - loss: 4.6697e-04 - acc: 0.9999\n",
      "Epoch 28/32\n",
      " - 0s - loss: 4.4386e-04 - acc: 0.9999\n",
      "Epoch 29/32\n",
      " - 0s - loss: 4.3061e-04 - acc: 0.9999\n",
      "Epoch 30/32\n",
      " - 0s - loss: 4.2249e-04 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 4.1402e-04 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 4.0863e-04 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 1s - loss: 2.4818 - acc: 0.8425\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.1556 - acc: 0.9982\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.1087 - acc: 0.9988\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0783 - acc: 0.9995\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0606 - acc: 0.9997\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0348 - acc: 0.9998\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0101 - acc: 0.9997\n",
      "Epoch 8/32\n",
      " - 0s - loss: 0.0011 - acc: 0.9998\n",
      "Epoch 9/32\n",
      " - 0s - loss: 9.9776e-04 - acc: 0.9998\n",
      "Epoch 10/32\n",
      " - 0s - loss: 9.1614e-04 - acc: 0.9998\n",
      "Epoch 11/32\n",
      " - 0s - loss: 8.4871e-04 - acc: 0.9998\n",
      "Epoch 12/32\n",
      " - 0s - loss: 7.6282e-04 - acc: 0.9998\n",
      "Epoch 13/32\n",
      " - 0s - loss: 6.6144e-04 - acc: 0.9999\n",
      "Epoch 14/32\n",
      " - 0s - loss: 5.9950e-04 - acc: 0.9999\n",
      "Epoch 15/32\n",
      " - 0s - loss: 5.5969e-04 - acc: 0.9999\n",
      "Epoch 16/32\n",
      " - 0s - loss: 5.0481e-04 - acc: 0.9999\n",
      "Epoch 17/32\n",
      " - 0s - loss: 4.3195e-04 - acc: 0.9999\n",
      "Epoch 18/32\n",
      " - 0s - loss: 3.9053e-04 - acc: 0.9999\n",
      "Epoch 19/32\n",
      " - 0s - loss: 3.4194e-04 - acc: 0.9999\n",
      "Epoch 20/32\n",
      " - 0s - loss: 3.1037e-04 - acc: 0.9999\n",
      "Epoch 21/32\n",
      " - 0s - loss: 3.0069e-04 - acc: 0.9999\n",
      "Epoch 22/32\n",
      " - 0s - loss: 2.8608e-04 - acc: 0.9999\n",
      "Epoch 23/32\n",
      " - 0s - loss: 2.5035e-04 - acc: 0.9999\n",
      "Epoch 24/32\n",
      " - 0s - loss: 2.2163e-04 - acc: 0.9999\n",
      "Epoch 25/32\n",
      " - 0s - loss: 2.1178e-04 - acc: 0.9999\n",
      "Epoch 26/32\n",
      " - 0s - loss: 1.9601e-04 - acc: 0.9999\n",
      "Epoch 27/32\n",
      " - 0s - loss: 1.8565e-04 - acc: 0.9999\n",
      "Epoch 28/32\n",
      " - 0s - loss: 1.6583e-04 - acc: 0.9999\n",
      "Epoch 29/32\n",
      " - 0s - loss: 1.6836e-04 - acc: 0.9999\n",
      "Epoch 30/32\n",
      " - 0s - loss: 1.5569e-04 - acc: 0.9999\n",
      "Epoch 31/32\n",
      " - 0s - loss: 1.6116e-04 - acc: 0.9999\n",
      "Epoch 32/32\n",
      " - 0s - loss: 1.5887e-04 - acc: 0.9999\n",
      "Epoch 1/32\n",
      " - 1s - loss: 1.6530 - acc: 0.8338\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0166 - acc: 0.9965\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0048 - acc: 0.9993\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0029 - acc: 0.9995\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0022 - acc: 0.9996\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0018 - acc: 0.9996\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0015 - acc: 0.9996\n",
      "Epoch 8/32\n",
      " - 0s - loss: 0.0012 - acc: 0.9997\n",
      "Epoch 9/32\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " - 0s - loss: 9.8353e-04 - acc: 0.9999\n",
      "Epoch 10/32\n",
      " - 0s - loss: 8.6203e-04 - acc: 0.9998\n",
      "Epoch 11/32\n",
      " - 0s - loss: 7.5677e-04 - acc: 0.9999\n",
      "Epoch 12/32\n",
      " - 0s - loss: 6.7997e-04 - acc: 0.9999\n",
      "Epoch 13/32\n",
      " - 0s - loss: 6.3536e-04 - acc: 0.9999\n",
      "Epoch 14/32\n",
      " - 0s - loss: 5.5191e-04 - acc: 1.0000\n",
      "Epoch 15/32\n",
      " - 0s - loss: 5.3189e-04 - acc: 0.9999\n",
      "Epoch 16/32\n",
      " - 0s - loss: 4.9038e-04 - acc: 1.0000\n",
      "Epoch 17/32\n",
      " - 0s - loss: 4.6946e-04 - acc: 1.0000\n",
      "Epoch 18/32\n",
      " - 0s - loss: 4.4976e-04 - acc: 1.0000\n",
      "Epoch 19/32\n",
      " - 0s - loss: 4.2679e-04 - acc: 1.0000\n",
      "Epoch 20/32\n",
      " - 0s - loss: 3.9835e-04 - acc: 1.0000\n",
      "Epoch 21/32\n",
      " - 0s - loss: 3.8415e-04 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 3.8285e-04 - acc: 1.0000\n",
      "Epoch 23/32\n",
      " - 0s - loss: 3.4844e-04 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 3.2964e-04 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 3.0397e-04 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 2.9975e-04 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 3.1083e-04 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 2.8958e-04 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 2.5274e-04 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 2.3449e-04 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 2.6000e-04 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 1.9719e-04 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 1s - loss: 0.8812 - acc: 0.8699\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.2341 - acc: 0.9897\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.1646 - acc: 0.9968\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.1195 - acc: 0.9998\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0915 - acc: 0.9998\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0719 - acc: 0.9999\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0576 - acc: 0.9999\n",
      "Epoch 8/32\n",
      " - 0s - loss: 0.0469 - acc: 0.9999\n",
      "Epoch 9/32\n",
      " - 0s - loss: 0.0388 - acc: 0.9999\n",
      "Epoch 10/32\n",
      " - 0s - loss: 0.0325 - acc: 1.0000\n",
      "Epoch 11/32\n",
      " - 0s - loss: 0.0274 - acc: 1.0000\n",
      "Epoch 12/32\n",
      " - 0s - loss: 0.0234 - acc: 1.0000\n",
      "Epoch 13/32\n",
      " - 0s - loss: 0.0201 - acc: 1.0000\n",
      "Epoch 14/32\n",
      " - 0s - loss: 0.0173 - acc: 1.0000\n",
      "Epoch 15/32\n",
      " - 0s - loss: 0.0150 - acc: 1.0000\n",
      "Epoch 16/32\n",
      " - 0s - loss: 0.0131 - acc: 1.0000\n",
      "Epoch 17/32\n",
      " - 0s - loss: 0.0115 - acc: 1.0000\n",
      "Epoch 18/32\n",
      " - 0s - loss: 0.0101 - acc: 1.0000\n",
      "Epoch 19/32\n",
      " - 0s - loss: 0.0089 - acc: 1.0000\n",
      "Epoch 20/32\n",
      " - 0s - loss: 0.0078 - acc: 1.0000\n",
      "Epoch 21/32\n",
      " - 0s - loss: 0.0069 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 0.0062 - acc: 1.0000\n",
      "Epoch 23/32\n",
      " - 0s - loss: 0.0055 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 0.0049 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 0.0044 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 0.0039 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 0.0035 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 0.0031 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 0.0028 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 0.0025 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 0.0023 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 0.0021 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 1s - loss: 1.2168 - acc: 0.9033\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0042 - acc: 0.9989\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0022 - acc: 0.9995\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0017 - acc: 0.9998\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0013 - acc: 0.9998\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0010 - acc: 0.9998\n",
      "Epoch 7/32\n",
      " - 0s - loss: 8.2920e-04 - acc: 0.9998\n",
      "Epoch 8/32\n",
      " - 0s - loss: 6.7225e-04 - acc: 0.9999\n",
      "Epoch 9/32\n",
      " - 0s - loss: 5.5550e-04 - acc: 0.9999\n",
      "Epoch 10/32\n",
      " - 0s - loss: 4.5557e-04 - acc: 0.9999\n",
      "Epoch 11/32\n",
      " - 0s - loss: 3.8830e-04 - acc: 0.9999\n",
      "Epoch 12/32\n",
      " - 0s - loss: 3.1364e-04 - acc: 0.9999\n",
      "Epoch 13/32\n",
      " - 0s - loss: 2.7557e-04 - acc: 0.9999\n",
      "Epoch 14/32\n",
      " - 0s - loss: 2.2439e-04 - acc: 0.9999\n",
      "Epoch 15/32\n",
      " - 0s - loss: 1.7608e-04 - acc: 1.0000\n",
      "Epoch 16/32\n",
      " - 0s - loss: 1.5520e-04 - acc: 1.0000\n",
      "Epoch 17/32\n",
      " - 0s - loss: 1.2653e-04 - acc: 1.0000\n",
      "Epoch 18/32\n",
      " - 0s - loss: 1.1279e-04 - acc: 1.0000\n",
      "Epoch 19/32\n",
      " - 0s - loss: 8.2122e-05 - acc: 1.0000\n",
      "Epoch 20/32\n",
      " - 0s - loss: 8.3282e-05 - acc: 1.0000\n",
      "Epoch 21/32\n",
      " - 0s - loss: 5.6347e-05 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 5.4333e-05 - acc: 1.0000\n",
      "Epoch 23/32\n",
      " - 0s - loss: 5.0334e-05 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 3.5768e-05 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 3.2387e-05 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 2.8918e-05 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 2.3217e-05 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 2.3460e-05 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 1.9957e-05 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 1.6865e-05 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 1.3985e-05 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 1.1951e-05 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 1s - loss: 1.2767 - acc: 0.9037\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0066 - acc: 0.9974\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0032 - acc: 0.9994\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0022 - acc: 0.9998\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0018 - acc: 0.9998\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0015 - acc: 0.9998\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0013 - acc: 0.9998\n",
      "Epoch 8/32\n",
      " - 0s - loss: 0.0012 - acc: 0.9999\n",
      "Epoch 9/32\n",
      " - 0s - loss: 0.0011 - acc: 0.9999\n",
      "Epoch 10/32\n",
      " - 0s - loss: 9.9044e-04 - acc: 0.9998\n",
      "Epoch 11/32\n",
      " - 0s - loss: 8.8651e-04 - acc: 0.9998\n",
      "Epoch 12/32\n",
      " - 0s - loss: 7.8454e-04 - acc: 0.9999\n",
      "Epoch 13/32\n",
      " - 0s - loss: 7.0484e-04 - acc: 0.9999\n",
      "Epoch 14/32\n",
      " - 0s - loss: 6.3900e-04 - acc: 0.9999\n",
      "Epoch 15/32\n",
      " - 0s - loss: 5.7946e-04 - acc: 0.9999\n",
      "Epoch 16/32\n",
      " - 0s - loss: 5.2939e-04 - acc: 0.9999\n",
      "Epoch 17/32\n",
      " - 0s - loss: 4.9513e-04 - acc: 0.9999\n",
      "Epoch 18/32\n",
      " - 0s - loss: 4.7321e-04 - acc: 0.9999\n",
      "Epoch 19/32\n",
      " - 0s - loss: 4.7286e-04 - acc: 0.9999\n",
      "Epoch 20/32\n",
      " - 0s - loss: 4.5089e-04 - acc: 0.9999\n",
      "Epoch 21/32\n",
      " - 0s - loss: 4.4077e-04 - acc: 0.9999\n",
      "Epoch 22/32\n",
      " - 0s - loss: 4.3704e-04 - acc: 0.9999\n",
      "Epoch 23/32\n",
      " - 0s - loss: 4.3018e-04 - acc: 0.9999\n",
      "Epoch 24/32\n",
      " - 0s - loss: 4.3414e-04 - acc: 0.9999\n",
      "Epoch 25/32\n",
      " - 0s - loss: 4.2767e-04 - acc: 0.9999\n",
      "Epoch 26/32\n",
      " - 0s - loss: 4.2445e-04 - acc: 0.9999\n",
      "Epoch 27/32\n",
      " - 0s - loss: 4.2119e-04 - acc: 0.9999\n",
      "Epoch 28/32\n",
      " - 0s - loss: 4.1870e-04 - acc: 0.9999\n",
      "Epoch 29/32\n",
      " - 0s - loss: 4.1763e-04 - acc: 0.9999\n",
      "Epoch 30/32\n",
      " - 0s - loss: 4.1572e-04 - acc: 0.9999\n",
      "Epoch 31/32\n",
      " - 0s - loss: 4.1454e-04 - acc: 0.9999\n",
      "Epoch 32/32\n",
      " - 0s - loss: 4.1365e-04 - acc: 0.9999\n",
      "Epoch 1/32\n",
      " - 1s - loss: 0.3193 - acc: 0.9074\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0095 - acc: 0.9988\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0034 - acc: 0.9998\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0018 - acc: 0.9998\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0010 - acc: 0.9998\n",
      "Epoch 6/32\n",
      " - 0s - loss: 6.7951e-04 - acc: 0.9999\n",
      "Epoch 7/32\n",
      " - 0s - loss: 5.2616e-04 - acc: 0.9999\n",
      "Epoch 8/32\n",
      " - 0s - loss: 4.3928e-04 - acc: 1.0000\n",
      "Epoch 9/32\n",
      " - 0s - loss: 3.8341e-04 - acc: 1.0000\n",
      "Epoch 10/32\n",
      " - 0s - loss: 3.4977e-04 - acc: 1.0000\n",
      "Epoch 11/32\n",
      " - 0s - loss: 3.2381e-04 - acc: 1.0000\n",
      "Epoch 12/32\n",
      " - 0s - loss: 3.0368e-04 - acc: 1.0000\n",
      "Epoch 13/32\n",
      " - 0s - loss: 2.8751e-04 - acc: 1.0000\n",
      "Epoch 14/32\n",
      " - 0s - loss: 2.7639e-04 - acc: 1.0000\n",
      "Epoch 15/32\n",
      " - 0s - loss: 2.6966e-04 - acc: 1.0000\n",
      "Epoch 16/32\n",
      " - 0s - loss: 2.6399e-04 - acc: 1.0000\n",
      "Epoch 17/32\n",
      " - 0s - loss: 2.6001e-04 - acc: 1.0000\n",
      "Epoch 18/32\n",
      " - 0s - loss: 2.5640e-04 - acc: 1.0000\n",
      "Epoch 19/32\n",
      " - 0s - loss: 2.5327e-04 - acc: 1.0000\n",
      "Epoch 20/32\n",
      " - 0s - loss: 2.4914e-04 - acc: 1.0000\n",
      "Epoch 21/32\n",
      " - 0s - loss: 2.4697e-04 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 2.4390e-04 - acc: 1.0000\n",
      "Epoch 23/32\n",
      " - 0s - loss: 2.4001e-04 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 2.3803e-04 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 2.3417e-04 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 2.3228e-04 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 2.2660e-04 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 2.2587e-04 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 2.2225e-04 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 2.1812e-04 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 2.1544e-04 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 2.0893e-04 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 1s - loss: 1.5802 - acc: 0.8681\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0059 - acc: 0.9982\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0031 - acc: 0.9991\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0016 - acc: 0.9995\n",
      "Epoch 5/32\n",
      " - 0s - loss: 9.1823e-04 - acc: 0.9998\n",
      "Epoch 6/32\n",
      " - 0s - loss: 6.9196e-04 - acc: 0.9998\n",
      "Epoch 7/32\n",
      " - 0s - loss: 5.6040e-04 - acc: 0.9998\n",
      "Epoch 8/32\n",
      " - 0s - loss: 4.4890e-04 - acc: 0.9998\n",
      "Epoch 9/32\n",
      " - 0s - loss: 3.6928e-04 - acc: 0.9999\n",
      "Epoch 10/32\n",
      " - 0s - loss: 3.3954e-04 - acc: 0.9999\n",
      "Epoch 11/32\n",
      " - 0s - loss: 2.9153e-04 - acc: 0.9999\n",
      "Epoch 12/32\n",
      " - 0s - loss: 2.7115e-04 - acc: 0.9999\n",
      "Epoch 13/32\n",
      " - 0s - loss: 2.4561e-04 - acc: 1.0000\n",
      "Epoch 14/32\n",
      " - 0s - loss: 2.3749e-04 - acc: 1.0000\n",
      "Epoch 15/32\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " - 0s - loss: 2.1229e-04 - acc: 1.0000\n",
      "Epoch 16/32\n",
      " - 0s - loss: 2.0385e-04 - acc: 1.0000\n",
      "Epoch 17/32\n",
      " - 0s - loss: 1.8860e-04 - acc: 1.0000\n",
      "Epoch 18/32\n",
      " - 0s - loss: 1.9655e-04 - acc: 1.0000\n",
      "Epoch 19/32\n",
      " - 0s - loss: 1.9292e-04 - acc: 1.0000\n",
      "Epoch 20/32\n",
      " - 0s - loss: 1.7332e-04 - acc: 1.0000\n",
      "Epoch 21/32\n",
      " - 0s - loss: 1.8366e-04 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 1.6314e-04 - acc: 1.0000\n",
      "Epoch 23/32\n",
      " - 0s - loss: 1.6367e-04 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 1.5757e-04 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 1.6306e-04 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 1.4746e-04 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 1.5361e-04 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 1.3293e-04 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 1.6682e-04 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 1.4962e-04 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 1.7001e-04 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 1.1271e-04 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 1s - loss: 0.8391 - acc: 0.9372\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0045 - acc: 0.9994\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0032 - acc: 0.9997\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0029 - acc: 0.9998\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0026 - acc: 0.9998\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0023 - acc: 0.9998\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0019 - acc: 0.9998\n",
      "Epoch 8/32\n",
      " - 0s - loss: 0.0017 - acc: 0.9998\n",
      "Epoch 9/32\n",
      " - 0s - loss: 0.0012 - acc: 0.9998\n",
      "Epoch 10/32\n",
      " - 0s - loss: 7.1834e-04 - acc: 0.9999\n",
      "Epoch 11/32\n",
      " - 0s - loss: 6.6043e-04 - acc: 0.9999\n",
      "Epoch 12/32\n",
      " - 0s - loss: 6.1734e-04 - acc: 0.9999\n",
      "Epoch 13/32\n",
      " - 0s - loss: 5.9900e-04 - acc: 0.9999\n",
      "Epoch 14/32\n",
      " - 0s - loss: 5.6719e-04 - acc: 0.9999\n",
      "Epoch 15/32\n",
      " - 0s - loss: 5.5320e-04 - acc: 0.9999\n",
      "Epoch 16/32\n",
      " - 0s - loss: 5.2180e-04 - acc: 0.9999\n",
      "Epoch 17/32\n",
      " - 0s - loss: 5.1097e-04 - acc: 0.9999\n",
      "Epoch 18/32\n",
      " - 0s - loss: 4.8311e-04 - acc: 1.0000\n",
      "Epoch 19/32\n",
      " - 0s - loss: 4.6385e-04 - acc: 1.0000\n",
      "Epoch 20/32\n",
      " - 0s - loss: 4.4676e-04 - acc: 1.0000\n",
      "Epoch 21/32\n",
      " - 0s - loss: 4.2758e-04 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 4.1003e-04 - acc: 1.0000\n",
      "Epoch 23/32\n",
      " - 0s - loss: 4.0199e-04 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 3.9533e-04 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 3.8535e-04 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 3.8453e-04 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 3.7625e-04 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 3.7509e-04 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 3.7298e-04 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 3.7161e-04 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 3.6946e-04 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 3.6999e-04 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 1s - loss: 8.7860 - acc: 0.4532\n",
      "Epoch 2/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 3/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 4/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 5/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 6/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 7/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 8/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 9/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 10/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 11/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 12/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 13/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 14/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 15/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 16/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 17/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 18/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 19/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 20/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 21/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 22/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 23/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 24/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 25/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 26/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 27/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 28/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 29/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 30/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 31/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 32/32\n",
      " - 0s - loss: 8.4760 - acc: 0.4741\n",
      "Epoch 1/32\n",
      " - 1s - loss: 7.1662 - acc: 0.5508\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0035 - acc: 0.9995\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0019 - acc: 0.9998\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0017 - acc: 0.9998\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0015 - acc: 0.9998\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0013 - acc: 0.9998\n",
      "Epoch 7/32\n",
      " - 0s - loss: 9.1921e-04 - acc: 0.9999\n",
      "Epoch 8/32\n",
      " - 0s - loss: 6.9061e-04 - acc: 0.9999\n",
      "Epoch 9/32\n",
      " - 0s - loss: 6.4295e-04 - acc: 0.9999\n",
      "Epoch 10/32\n",
      " - 0s - loss: 5.7868e-04 - acc: 0.9999\n",
      "Epoch 11/32\n",
      " - 0s - loss: 5.0741e-04 - acc: 1.0000\n",
      "Epoch 12/32\n",
      " - 0s - loss: 4.7835e-04 - acc: 1.0000\n",
      "Epoch 13/32\n",
      " - 0s - loss: 4.5194e-04 - acc: 1.0000\n",
      "Epoch 14/32\n",
      " - 0s - loss: 4.3002e-04 - acc: 1.0000\n",
      "Epoch 15/32\n",
      " - 0s - loss: 4.1427e-04 - acc: 1.0000\n",
      "Epoch 16/32\n",
      " - 0s - loss: 3.9882e-04 - acc: 1.0000\n",
      "Epoch 17/32\n",
      " - 0s - loss: 3.8515e-04 - acc: 1.0000\n",
      "Epoch 18/32\n",
      " - 0s - loss: 3.6955e-04 - acc: 1.0000\n",
      "Epoch 19/32\n",
      " - 0s - loss: 3.6637e-04 - acc: 1.0000\n",
      "Epoch 20/32\n",
      " - 0s - loss: 3.6441e-04 - acc: 1.0000\n",
      "Epoch 21/32\n",
      " - 0s - loss: 3.6322e-04 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 3.6232e-04 - acc: 1.0000\n",
      "Epoch 23/32\n",
      " - 0s - loss: 3.6157e-04 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 3.6112e-04 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 3.6069e-04 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 3.6037e-04 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 3.6011e-04 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 3.5990e-04 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 3.5973e-04 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 3.5956e-04 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 3.5944e-04 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 3.5930e-04 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 1s - loss: 0.1369 - acc: 0.9842\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0045 - acc: 0.9993\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0031 - acc: 0.9994\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0022 - acc: 0.9995\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0017 - acc: 0.9996\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0014 - acc: 0.9997\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0012 - acc: 0.9997\n",
      "Epoch 8/32\n",
      " - 0s - loss: 9.0557e-04 - acc: 0.9999\n",
      "Epoch 9/32\n",
      " - 0s - loss: 8.0192e-04 - acc: 0.9998\n",
      "Epoch 10/32\n",
      " - 0s - loss: 5.9303e-04 - acc: 0.9999\n",
      "Epoch 11/32\n",
      " - 0s - loss: 5.1692e-04 - acc: 1.0000\n",
      "Epoch 12/32\n",
      " - 0s - loss: 4.6862e-04 - acc: 1.0000\n",
      "Epoch 13/32\n",
      " - 0s - loss: 4.0721e-04 - acc: 1.0000\n",
      "Epoch 14/32\n",
      " - 0s - loss: 3.8928e-04 - acc: 1.0000\n",
      "Epoch 15/32\n",
      " - 0s - loss: 3.7191e-04 - acc: 1.0000\n",
      "Epoch 16/32\n",
      " - 0s - loss: 3.5361e-04 - acc: 1.0000\n",
      "Epoch 17/32\n",
      " - 0s - loss: 3.3879e-04 - acc: 1.0000\n",
      "Epoch 18/32\n",
      " - 0s - loss: 3.1304e-04 - acc: 1.0000\n",
      "Epoch 19/32\n",
      " - 0s - loss: 2.7805e-04 - acc: 1.0000\n",
      "Epoch 20/32\n",
      " - 0s - loss: 3.0102e-04 - acc: 1.0000\n",
      "Epoch 21/32\n",
      " - 0s - loss: 2.7667e-04 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 2.7133e-04 - acc: 1.0000\n",
      "Epoch 23/32\n",
      " - 0s - loss: 2.5426e-04 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 2.5406e-04 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 2.3086e-04 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 2.1446e-04 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 2.2347e-04 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 1.9997e-04 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 2.1093e-04 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 1.7839e-04 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 1.5257e-04 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 1.9782e-04 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 1s - loss: 8.4375 - acc: 0.4764\n",
      "Epoch 2/32\n",
      " - 0s - loss: 2.1429 - acc: 0.8366\n",
      "Epoch 3/32\n",
      " - 0s - loss: 1.6606 - acc: 0.8964\n",
      "Epoch 4/32\n",
      " - 0s - loss: 1.6577 - acc: 0.8970\n",
      "Epoch 5/32\n",
      " - 0s - loss: 1.6571 - acc: 0.8971\n",
      "Epoch 6/32\n",
      " - 0s - loss: 1.6568 - acc: 0.8972\n",
      "Epoch 7/32\n",
      " - 0s - loss: 1.6567 - acc: 0.8972\n",
      "Epoch 8/32\n",
      " - 0s - loss: 1.6567 - acc: 0.8972\n",
      "Epoch 9/32\n",
      " - 0s - loss: 1.6566 - acc: 0.8972\n",
      "Epoch 10/32\n",
      " - 0s - loss: 1.6566 - acc: 0.8972\n",
      "Epoch 11/32\n",
      " - 0s - loss: 1.6566 - acc: 0.8972\n",
      "Epoch 12/32\n",
      " - 0s - loss: 1.6566 - acc: 0.8972\n",
      "Epoch 13/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 14/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 15/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 16/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 17/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 18/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 19/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 20/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 21/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 22/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 23/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 24/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 25/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 26/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 27/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 28/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 29/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 30/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 31/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 32/32\n",
      " - 0s - loss: 1.6565 - acc: 0.8972\n",
      "Epoch 1/32\n",
      " - 2s - loss: 8.2066 - acc: 0.4779\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0116 - acc: 0.9977\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0037 - acc: 0.9994\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0030 - acc: 0.9996\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0022 - acc: 0.9997\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0016 - acc: 0.9997\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0013 - acc: 0.9998\n",
      "Epoch 8/32\n",
      " - 0s - loss: 9.7587e-04 - acc: 0.9998\n",
      "Epoch 9/32\n",
      " - 0s - loss: 6.9702e-04 - acc: 0.9999\n",
      "Epoch 10/32\n",
      " - 0s - loss: 5.8565e-04 - acc: 0.9999\n",
      "Epoch 11/32\n",
      " - 0s - loss: 5.4788e-04 - acc: 0.9999\n",
      "Epoch 12/32\n",
      " - 0s - loss: 5.1582e-04 - acc: 0.9999\n",
      "Epoch 13/32\n",
      " - 0s - loss: 4.8120e-04 - acc: 0.9999\n",
      "Epoch 14/32\n",
      " - 0s - loss: 4.4896e-04 - acc: 1.0000\n",
      "Epoch 15/32\n",
      " - 0s - loss: 4.2401e-04 - acc: 1.0000\n",
      "Epoch 16/32\n",
      " - 0s - loss: 4.1204e-04 - acc: 1.0000\n",
      "Epoch 17/32\n",
      " - 0s - loss: 3.9596e-04 - acc: 1.0000\n",
      "Epoch 18/32\n",
      " - 0s - loss: 3.8080e-04 - acc: 1.0000\n",
      "Epoch 19/32\n",
      " - 0s - loss: 3.7420e-04 - acc: 1.0000\n",
      "Epoch 20/32\n",
      " - 0s - loss: 3.7009e-04 - acc: 1.0000\n",
      "Epoch 21/32\n",
      " - 0s - loss: 3.6885e-04 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 3.6779e-04 - acc: 1.0000\n",
      "Epoch 23/32\n",
      " - 0s - loss: 3.6686e-04 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 3.6605e-04 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 3.6534e-04 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 3.6471e-04 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 3.6415e-04 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 3.6365e-04 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 3.6318e-04 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 3.6278e-04 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 3.6239e-04 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 3.6206e-04 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 2s - loss: 0.4689 - acc: 0.9562\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0460 - acc: 0.9958\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0115 - acc: 0.9980\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0057 - acc: 0.9983\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0041 - acc: 0.9985\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0034 - acc: 0.9986\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0027 - acc: 0.9987\n",
      "Epoch 8/32\n",
      " - 0s - loss: 0.0024 - acc: 0.9989\n",
      "Epoch 9/32\n",
      " - 0s - loss: 0.0022 - acc: 0.9990\n",
      "Epoch 10/32\n",
      " - 0s - loss: 0.0021 - acc: 0.9990\n",
      "Epoch 11/32\n",
      " - 0s - loss: 0.0019 - acc: 0.9990\n",
      "Epoch 12/32\n",
      " - 0s - loss: 0.0018 - acc: 0.9990\n",
      "Epoch 13/32\n",
      " - 0s - loss: 0.0017 - acc: 0.9992\n",
      "Epoch 14/32\n",
      " - 0s - loss: 0.0016 - acc: 0.9992\n",
      "Epoch 15/32\n",
      " - 0s - loss: 0.0015 - acc: 0.9992\n",
      "Epoch 16/32\n",
      " - 0s - loss: 0.0010 - acc: 0.9998\n",
      "Epoch 17/32\n",
      " - 0s - loss: 8.8476e-04 - acc: 0.9999\n",
      "Epoch 18/32\n",
      " - 0s - loss: 8.3864e-04 - acc: 0.9999\n",
      "Epoch 19/32\n",
      " - 0s - loss: 8.2103e-04 - acc: 0.9999\n",
      "Epoch 20/32\n",
      " - 0s - loss: 8.1193e-04 - acc: 0.9999\n",
      "Epoch 21/32\n",
      " - 0s - loss: 7.9479e-04 - acc: 0.9999\n",
      "Epoch 22/32\n",
      " - 0s - loss: 7.8701e-04 - acc: 0.9999\n",
      "Epoch 23/32\n",
      " - 0s - loss: 7.8010e-04 - acc: 0.9999\n",
      "Epoch 24/32\n",
      " - 0s - loss: 8.0163e-04 - acc: 0.9999\n",
      "Epoch 25/32\n",
      " - 0s - loss: 7.6019e-04 - acc: 0.9999\n",
      "Epoch 26/32\n",
      " - 0s - loss: 7.5786e-04 - acc: 0.9999\n",
      "Epoch 27/32\n",
      " - 0s - loss: 7.5636e-04 - acc: 0.9999\n",
      "Epoch 28/32\n",
      " - 0s - loss: 7.5484e-04 - acc: 0.9999\n",
      "Epoch 29/32\n",
      " - 0s - loss: 7.5280e-04 - acc: 0.9999\n",
      "Epoch 30/32\n",
      " - 0s - loss: 7.5225e-04 - acc: 0.9999\n",
      "Epoch 31/32\n",
      " - 0s - loss: 7.5012e-04 - acc: 0.9999\n",
      "Epoch 32/32\n",
      " - 0s - loss: 7.5116e-04 - acc: 0.9999\n",
      "Epoch 1/32\n",
      " - 2s - loss: 0.3452 - acc: 0.9756\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.2305 - acc: 0.9984\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.1696 - acc: 0.9992\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.1280 - acc: 0.9996\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0992 - acc: 0.9998\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0786 - acc: 0.9998\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0634 - acc: 0.9998\n",
      "Epoch 8/32\n",
      " - 0s - loss: 0.0519 - acc: 0.9999\n",
      "Epoch 9/32\n",
      " - 0s - loss: 0.0431 - acc: 0.9998\n",
      "Epoch 10/32\n",
      " - 0s - loss: 0.0358 - acc: 0.9999\n",
      "Epoch 11/32\n",
      " - 0s - loss: 0.0302 - acc: 1.0000\n",
      "Epoch 12/32\n",
      " - 0s - loss: 0.0257 - acc: 1.0000\n",
      "Epoch 13/32\n",
      " - 0s - loss: 0.0221 - acc: 1.0000\n",
      "Epoch 14/32\n",
      " - 0s - loss: 0.0191 - acc: 1.0000\n",
      "Epoch 15/32\n",
      " - 0s - loss: 0.0166 - acc: 1.0000\n",
      "Epoch 16/32\n",
      " - 0s - loss: 0.0144 - acc: 1.0000\n",
      "Epoch 17/32\n",
      " - 0s - loss: 0.0126 - acc: 1.0000\n",
      "Epoch 18/32\n",
      " - 0s - loss: 0.0111 - acc: 1.0000\n",
      "Epoch 19/32\n",
      " - 0s - loss: 0.0097 - acc: 1.0000\n",
      "Epoch 20/32\n",
      " - 0s - loss: 0.0086 - acc: 1.0000\n",
      "Epoch 21/32\n",
      " - 0s - loss: 0.0076 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 0.0068 - acc: 1.0000\n",
      "Epoch 23/32\n",
      " - 0s - loss: 0.0060 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 0.0054 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 0.0048 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 0.0043 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 0.0038 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 0.0034 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 0.0031 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 0.0028 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 0.0025 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 0.0022 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 2s - loss: 3.9120 - acc: 0.7467\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0171 - acc: 0.9974\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0087 - acc: 0.9988\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0054 - acc: 0.9991\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0040 - acc: 0.9993\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0028 - acc: 0.9996\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0022 - acc: 0.9997\n",
      "Epoch 8/32\n",
      " - 0s - loss: 0.0019 - acc: 0.9997\n",
      "Epoch 9/32\n",
      " - 0s - loss: 0.0015 - acc: 0.9998\n",
      "Epoch 10/32\n",
      " - 0s - loss: 0.0013 - acc: 0.9998\n",
      "Epoch 11/32\n",
      " - 0s - loss: 0.0011 - acc: 0.9998\n",
      "Epoch 12/32\n",
      " - 0s - loss: 9.4394e-04 - acc: 0.9998\n",
      "Epoch 13/32\n",
      " - 0s - loss: 7.7022e-04 - acc: 0.9998\n",
      "Epoch 14/32\n",
      " - 0s - loss: 6.3955e-04 - acc: 0.9999\n",
      "Epoch 15/32\n",
      " - 0s - loss: 5.4264e-04 - acc: 0.9999\n",
      "Epoch 16/32\n",
      " - 0s - loss: 5.0406e-04 - acc: 0.9999\n",
      "Epoch 17/32\n",
      " - 0s - loss: 4.5685e-04 - acc: 0.9999\n",
      "Epoch 18/32\n",
      " - 0s - loss: 4.2148e-04 - acc: 0.9999\n",
      "Epoch 19/32\n",
      " - 0s - loss: 3.6026e-04 - acc: 0.9999\n",
      "Epoch 20/32\n",
      " - 0s - loss: 3.2132e-04 - acc: 0.9999\n",
      "Epoch 21/32\n",
      " - 0s - loss: 2.5087e-04 - acc: 1.0000\n",
      "Epoch 22/32\n",
      " - 0s - loss: 3.1223e-04 - acc: 0.9999\n",
      "Epoch 23/32\n",
      " - 0s - loss: 1.7493e-04 - acc: 1.0000\n",
      "Epoch 24/32\n",
      " - 0s - loss: 1.2230e-04 - acc: 1.0000\n",
      "Epoch 25/32\n",
      " - 0s - loss: 8.8405e-05 - acc: 1.0000\n",
      "Epoch 26/32\n",
      " - 0s - loss: 7.9814e-05 - acc: 1.0000\n",
      "Epoch 27/32\n",
      " - 0s - loss: 6.0237e-05 - acc: 1.0000\n",
      "Epoch 28/32\n",
      " - 0s - loss: 4.5852e-05 - acc: 1.0000\n",
      "Epoch 29/32\n",
      " - 0s - loss: 3.5723e-05 - acc: 1.0000\n",
      "Epoch 30/32\n",
      " - 0s - loss: 2.9298e-05 - acc: 1.0000\n",
      "Epoch 31/32\n",
      " - 0s - loss: 2.5357e-05 - acc: 1.0000\n",
      "Epoch 32/32\n",
      " - 0s - loss: 2.1670e-05 - acc: 1.0000\n",
      "Epoch 1/32\n",
      " - 2s - loss: 0.6123 - acc: 0.9205\n",
      "Epoch 2/32\n",
      " - 0s - loss: 0.0790 - acc: 0.9929\n",
      "Epoch 3/32\n",
      " - 0s - loss: 0.0090 - acc: 0.9972\n",
      "Epoch 4/32\n",
      " - 0s - loss: 0.0070 - acc: 0.9980\n",
      "Epoch 5/32\n",
      " - 0s - loss: 0.0055 - acc: 0.9982\n",
      "Epoch 6/32\n",
      " - 0s - loss: 0.0044 - acc: 0.9983\n",
      "Epoch 7/32\n",
      " - 0s - loss: 0.0039 - acc: 0.9987\n",
      "Epoch 8/32\n",
      " - 0s - loss: 0.0034 - acc: 0.9991\n",
      "Epoch 9/32\n",
      " - 0s - loss: 0.0026 - acc: 0.9997\n",
      "Epoch 10/32\n",
      " - 0s - loss: 0.0022 - acc: 0.9997\n",
      "Epoch 11/32\n",
      " - 0s - loss: 0.0013 - acc: 0.9998\n",
      "Epoch 12/32\n",
      " - 0s - loss: 0.0012 - acc: 0.9998\n",
      "Epoch 13/32\n",
      " - 0s - loss: 0.0012 - acc: 0.9999\n",
      "Epoch 14/32\n",
      " - 0s - loss: 0.0011 - acc: 0.9999\n",
      "Epoch 15/32\n",
      " - 0s - loss: 0.0011 - acc: 0.9999\n",
      "Epoch 16/32\n",
      " - 0s - loss: 0.0011 - acc: 0.9999\n",
      "Epoch 17/32\n",
      " - 0s - loss: 0.0010 - acc: 0.9999\n",
      "Epoch 18/32\n",
      " - 0s - loss: 0.0010 - acc: 0.9999\n",
      "Epoch 19/32\n",
      " - 0s - loss: 0.0010 - acc: 0.9999\n",
      "Epoch 20/32\n",
      " - 0s - loss: 9.8871e-04 - acc: 0.9999\n",
      "Epoch 21/32\n",
      " - 0s - loss: 9.7983e-04 - acc: 0.9999\n",
      "Epoch 22/32\n",
      " - 0s - loss: 9.7773e-04 - acc: 0.9999\n",
      "Epoch 23/32\n",
      " - 0s - loss: 9.7614e-04 - acc: 0.9999\n",
      "Epoch 24/32\n",
      " - 1s - loss: 9.7488e-04 - acc: 0.9999\n",
      "Epoch 25/32\n",
      " - 1s - loss: 9.7391e-04 - acc: 0.9999\n",
      "Epoch 26/32\n",
      " - 0s - loss: 9.7306e-04 - acc: 0.9999\n",
      "Epoch 27/32\n",
      " - 0s - loss: 9.7234e-04 - acc: 0.9999\n",
      "Epoch 28/32\n",
      " - 0s - loss: 9.7169e-04 - acc: 0.9999\n",
      "Epoch 29/32\n",
      " - 0s - loss: 9.7110e-04 - acc: 0.9999\n",
      "Epoch 30/32\n",
      " - 0s - loss: 9.7062e-04 - acc: 0.9999\n",
      "Epoch 31/32\n",
      " - 0s - loss: 9.7021e-04 - acc: 0.9999\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 32/32\n",
      " - 0s - loss: 9.6985e-04 - acc: 0.9999\n",
      "<class 'keras.wrappers.scikit_learn.KerasClassifier'>\n",
      "[[26227     1]\n",
      " [    2 23770]]\n",
      "total: 50000\n",
      "accuracy: 0.99994\n",
      "Matthews correlation coefficient: 0.9998797103336674\n",
      "Baseline: 93.76% (15.37%)\n"
     ]
    }
   ],
   "source": [
    "#for i in range(0,10):\n",
    "estimator = KerasClassifier(build_fn=baseline_model, epochs=32, batch_size=200, verbose=2)\n",
    "\n",
    "kfold = KFold(n_splits=10, shuffle=True, random_state=seed)\n",
    "y_pred = cross_val_predict(estimator, X, dummy_y, cv=kfold)\n",
    "results = cross_val_score(estimator, X, dummy_y, cv=kfold)\n",
    "\n",
    "trained_classifier = estimator.fit(X, Y)\n",
    "print(type(estimator))\n",
    "\n",
    "cm = confusion_matrix(Y, y_pred)\n",
    "print(cm)\n",
    "print(\"total: \" + str(cm.sum()))\n",
    "print(\"accuracy: \" + str(numpy.trace(cm) / cm.sum()))\n",
    "print(\"Matthews correlation coefficient: \" + str(matthews_corrcoef(Y, y_pred)))\n",
    "\n",
    "\n",
    "\n",
    "print(\"Baseline: %.2f%% (%.2f%%)\" % (results.mean()*100, results.std()*100))\n",
    "\n",
    "f = open(\"discriminatorResults.txt\", \"a+\")\n",
    "f.write(\"TP: %d, FP: %d, FN: %d, TN: %d\\n\" % (cm[0][0], cm[0][1], cm[1][0], cm[1][1]))\n",
    "f.close()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "f = open(\"discriminatorResults.txt\", \"a+\")\n",
    "f.write(\"TP: %d, FP: %d, FN: %d, TN: %d\\n\" % (cm[0][0], cm[0][1], cm[1][0], cm[1][1]))\n",
    "f.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Predicted  False   True  __all__\n",
      "Actual                          \n",
      "False      26227      1    26228\n",
      "True           2  23770    23772\n",
      "__all__    26229  23771    50000\n"
     ]
    }
   ],
   "source": [
    "from pandas_ml import ConfusionMatrix\n",
    "\n",
    "cm1 = ConfusionMatrix(Y, y_pred)\n",
    "print(cm1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Field          TP             FP             FN             TN             MC Rate        MCC            \n",
      "---------------------------------------------------------------------------------------------------\n",
      "\n",
      "neptune.       0.52454        0.00008        0.00004        0.47540        0.00011        0.99976        \n",
      "normal.        0.47540        0.00004        0.00008        0.52454        0.00013        0.99975        \n",
      "\n",
      "Average true positive rate: 0.49997\n",
      "Average false positive rate: 5.9159771751687025e-05\n",
      "Average false negative rate: 6.31003295487576e-05\n",
      "Average true negative rate: 0.49997\n",
      "Average Misclassification Rate: 0.00012028321823107069\n",
      "Matthews Correlation Coefficient: 0.9997554950513524\n"
     ]
    }
   ],
   "source": [
    "def true_positive_rate(cm, i, total):\n",
    "    return cm[i][i]/total\n",
    "    \n",
    "def false_positive_rate(cm,j):\n",
    "    fp_rate = 0\n",
    "    for i in range(0,len(cm)):\n",
    "        if (i != j):\n",
    "            fp_rate += cm[i][j]\n",
    "    if ((fp_rate + cm[j][j]) != 0):\n",
    "        return fp_rate/(fp_rate + cm[j][j])\n",
    "    else:\n",
    "        return 0;\n",
    "        \n",
    "def false_negative_rate(cm, i):\n",
    "    fn_rate = 0;\n",
    "    for j in range(0,len(cm)):\n",
    "        if (i != j):\n",
    "            fn_rate += cm[i][j]\n",
    "    if ((fn_rate + cm[j][j]) != 0):\n",
    "        return fn_rate/(fn_rate + cm[j][j])\n",
    "    else:\n",
    "        return 0;\n",
    "\n",
    "def true_negative_rate(cm,i,total):\n",
    "    tn_rate = 0\n",
    "    for j in range(0,len(cm)):\n",
    "        for k in range(0,len(cm)):\n",
    "            if (j != i and k != i):\n",
    "                tn_rate += cm[j][k]\n",
    "    return tn_rate/total\n",
    "\n",
    "def misclassification_rate(cm,l):\n",
    "    fp_rate = 0\n",
    "    fn_rate = 0\n",
    "    for i in range(0,len(cm)):\n",
    "        if (i != l):\n",
    "            fp_rate += cm[i][l]\n",
    "    for j in range(0,len(cm)):\n",
    "        if (l != j):\n",
    "            fn_rate += cm[l][j]\n",
    "    return (fp_rate + fn_rate)/(fp_rate + fn_rate + cm[l][l])\n",
    "    \n",
    "def avg_true_positive_rate(cm):\n",
    "    tp_rate = 0\n",
    "    for i in range(0,len(cm)):\n",
    "        tp_rate += true_positive_rate(cm,i,cm.sum())\n",
    "    return tp_rate/len(cm)\n",
    "\n",
    "def avg_false_positive_rate(cm):\n",
    "    fp_rate = 0\n",
    "    for i in range(0,len(cm)):\n",
    "        fp_rate += false_positive_rate(cm,i)\n",
    "    return fp_rate/len(cm)\n",
    "\n",
    "def avg_false_negative_rate(cm):\n",
    "    fn_rate = 0\n",
    "    for i in range(0,len(cm)):\n",
    "        fn_rate += false_negative_rate(cm,i)\n",
    "    return fn_rate/len(cm)\n",
    "\n",
    "def avg_true_negative_rate(cm):\n",
    "    tn_rate = 0\n",
    "    for i in range(0,len(cm)):\n",
    "        tn_rate += true_negative_rate(cm,i,cm.sum())\n",
    "    return tn_rate/len(cm)\n",
    "\n",
    "def avg_misclassification_rate(cm):\n",
    "    mc_rate = 0\n",
    "    for i in range(0,len(cm)):\n",
    "        mc_rate += misclassification_rate(cm,i)\n",
    "    return mc_rate/len(cm)\n",
    "\n",
    "def matthews(TP,TN,FP,FN):\n",
    "    if ((TP + FP)*(TP + FN)*(TN + FP)*(TN + FN) == 0):\n",
    "        return 0\n",
    "    return (TP*TN - FP*FN)/math.sqrt((TP + FP)*(TP + FN)*(TN + FP)*(TN + FN))\n",
    "\n",
    "def print_table(cm):\n",
    "    print('{:15}'.format('Field'), end='')\n",
    "    print('{:15}'.format('TP'), end='')\n",
    "    print('{:15}'.format('FP'), end='')\n",
    "    print('{:15}'.format('FN'), end='')\n",
    "    print('{:15}'.format('TN'), end='')\n",
    "    print('{:15}'.format('MC Rate'), end='')\n",
    "    print('{:15}'.format('MCC'), end='')\n",
    "    print()\n",
    "    print('---------------------------------------------------------------------------------------------------')\n",
    "    print()\n",
    "    for i in range(0,len(cm)):\n",
    "        print('{:15}'.format(attack_labels[i]), end='')\n",
    "        print('{:15}'.format('{:.5f}'.format(true_positive_rate(cm,i,cm.sum()))), end='')\n",
    "        print('{:15}'.format('{:.5f}'.format(false_positive_rate(cm,i))), end='')\n",
    "        print('{:15}'.format('{:.5f}'.format(false_negative_rate(cm,i))), end='')\n",
    "        print('{:15}'.format('{:.5f}'.format(true_negative_rate(cm,i,cm.sum()))), end='')\n",
    "        print('{:15}'.format('{:.5f}'.format(misclassification_rate(cm,i))), end='')\n",
    "        print('{:15}'.format('{:.5f}'.format(matthews(true_positive_rate(cm,i,cm.sum()),true_negative_rate(cm,i,cm.sum()),\n",
    "                                                      false_positive_rate(cm,i),false_negative_rate(cm,i)))),end='')\n",
    "        print()\n",
    "    print()\n",
    "\n",
    "print_table(cm)\n",
    "print(\"Average true positive rate: \" + str(avg_true_positive_rate(cm)))\n",
    "print(\"Average false positive rate: \" + str(avg_false_positive_rate(cm)))\n",
    "print(\"Average false negative rate: \" + str(avg_false_negative_rate(cm)))\n",
    "print(\"Average true negative rate: \" + str(avg_true_negative_rate(cm)))\n",
    "print(\"Average Misclassification Rate: \" + str(avg_misclassification_rate(cm)))\n",
    "print(\"Matthews Correlation Coefficient: \" + str(matthews(avg_true_positive_rate(cm),avg_true_negative_rate(cm),avg_false_positive_rate(cm),avg_false_negative_rate(cm))))\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Confusion matrix, without normalization\n",
      "[[26227     1]\n",
      " [    2 23770]]\n",
      "Normalized confusion matrix\n",
      "[[1.00e+00 3.81e-05]\n",
      " [8.41e-05 1.00e+00]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import itertools\n",
    "def plot_confusion_matrix(cm, classes,\n",
    "                          normalize=False,\n",
    "                          title='Confusion matrix',\n",
    "                          cmap=plt.cm.Blues):\n",
    "    \"\"\"\n",
    "    This function prints and plots the confusion matrix.\n",
    "    Normalization can be applied by setting `normalize=True`.\n",
    "    \"\"\"\n",
    "    if normalize:\n",
    "        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n",
    "        print(\"Normalized confusion matrix\")\n",
    "    else:\n",
    "        print('Confusion matrix, without normalization')\n",
    "\n",
    "    print(cm)\n",
    "\n",
    "    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n",
    "    plt.title(title)\n",
    "    plt.colorbar()\n",
    "    tick_marks = np.arange(len(classes))\n",
    "    plt.xticks(tick_marks, classes, rotation=45)\n",
    "    plt.yticks(tick_marks, classes)\n",
    "\n",
    "    fmt = '.2f' if normalize else 'd'\n",
    "    thresh = cm.max() / 2.\n",
    "    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n",
    "        plt.text(j, i, format(cm[i, j], fmt),\n",
    "                 horizontalalignment=\"center\",\n",
    "                 color=\"white\" if cm[i, j] > thresh else \"black\")\n",
    "\n",
    "    plt.ylabel('True label')\n",
    "    plt.xlabel('Predicted label')\n",
    "    plt.tight_layout()\n",
    "\n",
    "\n",
    "# Compute confusion matrix\n",
    "cnf_matrix = confusion_matrix(Y, y_pred)\n",
    "np.set_printoptions(precision=2)\n",
    "\n",
    "# Plot non-normalized confusion matrix\n",
    "plt.figure()\n",
    "plot_confusion_matrix(cnf_matrix, classes=attack_labels,\n",
    "                      title='Confusion matrix, without normalization')\n",
    "\n",
    "# Plot normalized confusion matrix\n",
    "plt.figure()\n",
    "plot_confusion_matrix(cnf_matrix, classes=attack_labels, normalize=True,\n",
    "                      title='Normalized confusion matrix')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0\n",
      " 1 0 1 0 0 1 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0\n",
      " 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 1 0 0 0 1 1\n",
      " 0 1 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0]\n"
     ]
    }
   ],
   "source": [
    "#print(type(X))\n",
    "#print(X[0],Y[0])\n",
    "\n",
    "\n",
    "sample = numpy.loadtxt(\"GANresults.txt\")\n",
    "predicted = estimator.predict(sample)#,batch_size=0)\n",
    "print(predicted)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
